大家好!歡迎來到鐵人賽第十五天。
在昨天的實作中,我們成功串接了 CIRCL CVE API,讓 n8n 能夠根據收到的資安告警,自動查詢外部漏洞資料庫,取得對應的 CVE 漏洞資訊。
不過,當我們把這些情報直接推播到 LINE 時,卻發現了一個問題:原始漏洞描述通常是冗長的英文技術文件,對於需要快速掌握風險的維運人員來說,閱讀起來並不方便。
尤其當系統在深夜發出告警時,如果還需要花時間翻譯英文、理解技術名詞,再判斷漏洞可能造成的影響,就會增加處理告警的時間。
因此,今天我們要進一步導入 AI,讓系統不只能查詢漏洞情報,還能自動整理內容,產生容易理解的繁體中文摘要。
這也是 RAG(Retrieval-Augmented Generation,檢索增強生成)架構中的最後一個階段:Generation(生成)。
今天的目標,就是讓 AI 成為系統中的資安情報助理,協助我們將查詢到的漏洞資料轉換成精簡、易讀的中文摘要,再透過 LINE 推播給使用者。
要讓 n8n 具備 AI 分析能力,我們需要先取得 AI 模型的 API Key。
這次以 OpenAI API 為例,示範如何建立金鑰並串接至 n8n。
API Key 是存取模型服務的重要憑證,請勿直接公開在文章、GitHub 儲存庫或其他公開環境中。
💡 實務小知識:
除了 OpenAI,也可以考慮使用其他提供 API 的模型服務,例如 Google Gemini 或 Groq。實際可用的模型、免費額度與申請條件,則需要依照各平台的規定確認。
取得 API Key 後,就可以回到 n8n,將 AI 模型整合進原本的漏洞情報處理流程。
原本的流程是:
HTTP Request(CVE 查詢)→ HTTP Request(LINE 推播)
現在,我們要在兩者之間加入 AI 節點,讓系統先整理漏洞情報,再將結果傳送至 LINE。
完成後,n8n 就具備了呼叫 AI 模型的能力。
接下來是今天最重要的部分:如何讓 AI 根據實際查詢到的漏洞資料,產生符合需求的摘要?
如果直接要求 AI 解釋某個 CVE 編號,模型可能會根據既有知識生成內容,甚至產生與實際漏洞不符的資訊。
因此,我們要將昨天從 CIRCL CVE API 取得的漏洞描述,直接傳遞給 AI,讓它根據提供的資料進行整理。
這就是 RAG 架構中「檢索」與「生成」的結合。
在 OpenAI 節點的 Messages 區塊中新增一則訊息,並將 Role 設定為 User。
接著,在 Content 欄位切換至 Expression,輸入以下提示詞:
你是一位專業的資安維運工程師。
請閱讀以下 CVE 漏洞原始情報,並以繁體中文整理出一段簡明扼要的摘要。
請遵守以下要求:
1. 摘要控制在 100 字以內。
2. 說明漏洞的主要影響。
3. 使用一般工程師容易理解的語言。
4. 僅根據提供的原始情報進行整理,不得自行推測或捏造資訊。
5. 如果原始資料不足以判斷漏洞影響,請明確說明。
【原始情報】:
{{ $json.containers.cna.descriptions[0].value }}
這段提示詞的目的,是讓 AI 將原本冗長的英文漏洞描述轉換成簡潔的中文摘要,同時降低模型自行補充未經確認資訊的風險。
設定完成後,點擊 Execute step。
如果資料格式與模型設定正確,右側的 OUTPUT 就會顯示 AI 生成的摘要。
例如,原本的英文漏洞描述經過 AI 整理後,就能轉換成更容易閱讀的中文內容。
需要注意的是,AI 產生的摘要仍然需要經過驗證,不能直接將模型的輸出視為已確認的漏洞分析結論。
當 AI 已經成功產生中文摘要後,下一步就是將結果整合進原本的 LINE 推播訊息。
開啟原本的 HTTP Request(LINE 推播)節點,找到傳送訊息的 JSON Body。
原本我們使用的是 CVE API 回傳的英文描述:
{{ $json.containers.cna.descriptions[0].value }}
現在,則要將它替換成 AI 節點輸出的摘要內容。
如果使用的是會將生成文字放在 message.content 欄位的節點,可以使用:
{{ $json.message.content }}
不過,實際的輸出欄位會依照 n8n 節點類型與版本而有所不同,請先確認 AI 節點的 OUTPUT,再設定正確的 Expression。
以下是修改後的 JSON 範例:
{
"to": "你的_User_ID",
"messages": [
{
"type": "text",
"text": "🚨【資安系統告警】🚨\n\n受害主機:Ubuntu-Web-01\n漏洞編號:CVE-2023-38325\n受害套件:curl\n\n【AI 漏洞摘要】\n{{ $json.message.content }}"
}
]
}
這樣一來,LINE 訊息就能同時呈現主機資訊、漏洞編號、受害套件,以及 AI 產生的中文摘要。
💡 注意:
經過 HTTP Request 與 AI 節點後,資料的結構可能會改變,原本 Webhook 中的主機名稱、漏洞編號等欄位不一定還能直接使用。
如果需要保留前面節點的資料,可以透過 n8n 的節點引用或 Edit Fields 等方式,將必要欄位重新整合,再傳遞給 LINE 推播節點。
完成所有設定後,就可以開始測試整個工作流程。
Wazuh 偵測資安告警
↓
FastAPI 接收並解析告警
↓
n8n 接收 Webhook 資料
↓
HTTP Request 查詢 CIRCL CVE API
↓
OpenAI 節點整理漏洞情報
↓
HTTP Request 傳送 LINE 訊息
↓
收到繁體中文漏洞摘要
執行工作流程後,可以依序確認以下項目:
如果某個節點發生錯誤,可以先查看該節點的 INPUT 與 OUTPUT,確認資料是否正確傳遞。
當整個流程成功運作時,我們就完成了從漏洞情報檢索到 AI 自動摘要,再到 LINE 通知的整合。

今天,我們在原本的漏洞情報查詢流程中加入了 AI 節點,完成了 RAG 架構中生成階段的初步實作。
回顧這幾天的進度:
透過這次的整合,系統不再只是單純傳送原始告警,而是能夠進一步整理漏洞資訊,讓維運人員更快掌握告警內容。
不過,目前 AI 的工作仍然以情報整理為主,尚未真正判斷漏洞是否適用於受害主機,也沒有執行任何自動修補操作。
那麼,當系統取得漏洞情報並完成初步摘要後,能不能進一步判斷漏洞的風險,並根據不同情況採取適當的處置?
明天,我們將繼續探索自動化資安維運的下一個階段,嘗試將漏洞情報與自動化處置流程結合,逐步建立更完整的 SOAR 工作流程。
我們明天見!
小提醒: 這篇文章中的節點名稱與輸出欄位,需要依照你實際使用的 n8n 版本確認,尤其是 OpenAI 節點的輸出格式。這樣讀者跟著操作時,才不會因為欄位不同而卡住。